#include <iostream>
#include <unordered_set>

class Point {
public:
    int x, y;

    // 构造函数
    Point(int x, int y) : x(x), y(y) {}

    // 等于操作符，用于比较两个点是否相同
    bool operator==(const Point& other) const {
        return x == other.x && y == other.y;
    }
};

// 自定义哈希函数
struct PointHash {
    // 哈希操作符函数
    std::size_t operator()(const Point& p) const {
        std::hash<int> int_hash;
        // 使用位运算以增加散列效果，有助于均匀分布哈希值
        // 原则: 高效性，尝试最小化冲突，但这种简单的方法在特定数据分布下可能仍然会引起冲突
        return int_hash(p.x) ^ (int_hash(p.y) << 1);
    }
};

// 自定义等于函数
struct PointEqual {
    // 比较两个点是否相等
    bool operator()(const Point& p1, const Point& p2) const {
        return p1.x == p2.x && p1.y == p2.y;
    }
};

int main() {
    std::unordered_set<Point, PointHash, PointEqual> points;
    points.insert(Point(1, 2));
    points.insert(Point(3, 4));
    points.insert(Point(1, 2)); // 不会添加，因为(1,2)已存在

    // 输出集合中的所有点
    for (const auto& p : points) {
        std::cout << "(" << p.x << ", " << p.y << ")" << std::endl;
    }
} 